#!/usr/bin/env node

const { execSync } = require('child_process');
const fs = require('fs');
const path = require('path');

console.log('🚀 开始设置测试环境...\n');

// 1. 检查测试数据库
console.log('📊 检查测试数据库配置...');
try {
  // 检查是否存在测试环境配置
  const testEnvPath = path.join(__dirname, '../backend/.env.test');
  if (!fs.existsSync(testEnvPath)) {
    console.log('❌ 测试环境配置文件不存在');
    process.exit(1);
  }
  console.log('✅ 测试环境配置文件存在');
} catch (error) {
  console.error('❌ 检查测试环境配置失败:', error.message);
  process.exit(1);
}

// 2. 安装依赖
console.log('\n📦 安装测试依赖...');
try {
  // 安装后端测试依赖
  console.log('安装后端测试依赖...');
  execSync('npm install', { 
    cwd: path.join(__dirname, '../backend'),
    stdio: 'inherit' 
  });

  // 安装前端测试依赖
  console.log('安装前端测试依赖...');
  execSync('npm install @vue/test-utils vue-jest jest-transform-stub', { 
    cwd: path.join(__dirname, '../frontend'),
    stdio: 'inherit' 
  });

  console.log('✅ 依赖安装完成');
} catch (error) {
  console.error('❌ 依赖安装失败:', error.message);
  process.exit(1);
}

// 3. 创建测试数据库（如果不存在）
console.log('\n🗄️  准备测试数据库...');
try {
  const mysql = require('mysql2/promise');
  const config = require('../backend/src/config/database.test.js');
  
  // 连接到MySQL服务器（不指定数据库）
  const connection = await mysql.createConnection({
    host: config.test.host,
    port: config.test.port,
    user: config.test.username,
    password: config.test.password
  });

  // 创建测试数据库（如果不存在）
  await connection.execute(`CREATE DATABASE IF NOT EXISTS \`${config.test.database}\``);
  console.log(`✅ 测试数据库 ${config.test.database} 准备完成`);
  
  await connection.end();
} catch (error) {
  console.warn('⚠️  数据库准备失败（可能需要手动创建）:', error.message);
}

// 4. 运行数据库迁移（如果存在）
console.log('\n🔄 运行数据库迁移...');
try {
  const migrationsPath = path.join(__dirname, '../backend/src/migrations');
  if (fs.existsSync(migrationsPath)) {
    execSync('npm run migrate', { 
      cwd: path.join(__dirname, '../backend'),
      stdio: 'inherit',
      env: { ...process.env, NODE_ENV: 'test' }
    });
    console.log('✅ 数据库迁移完成');
  } else {
    console.log('ℹ️  未找到迁移文件，跳过迁移');
  }
} catch (error) {
  console.warn('⚠️  数据库迁移失败:', error.message);
}

// 5. 创建测试报告目录
console.log('\n📁 创建测试报告目录...');
try {
  const dirs = [
    path.join(__dirname, '../backend/coverage'),
    path.join(__dirname, '../frontend/coverage'),
    path.join(__dirname, '../test-reports')
  ];

  dirs.forEach(dir => {
    if (!fs.existsSync(dir)) {
      fs.mkdirSync(dir, { recursive: true });
      console.log(`✅ 创建目录: ${dir}`);
    }
  });
} catch (error) {
  console.error('❌ 创建测试报告目录失败:', error.message);
}

console.log('\n🎉 测试环境设置完成！');
console.log('\n可用的测试命令:');
console.log('  后端测试: cd backend && npm test');
console.log('  前端测试: cd frontend && npm test');
console.log('  测试覆盖率: cd backend && npm run test:coverage');
console.log('  监听模式: cd frontend && npm run test:watch');